/*
	linux物联网平台服务器端主程序


*/

#include "iot_server.h"

#if defined(LOG_TAG)
#undef LOG_TAG 
#define LOG_TAG    "iot_server"
#else 
#define LOG_TAG    "iot_server"
#endif

char mob_str[4][20]= {0}; //定义解析字符串的二维数组		

void* recv_mob_thread(void *arg)
{
	int ret;
	char buf[SIZE];
	int newfd = *((int *)arg);

	while (1) {
		bzero(buf, SIZE);
		ret = recv(newfd, buf, sizeof(buf), 0); //类似read  阻塞
		if (ret < 0)
			log_e("recv fail");


		log_e("[%d]>收到手机端发送的字符串:%s", __LINE__, buf);

		//将socket中接收数据缓冲区解析
		bzero(mob_str[0], strlen(mob_str[0])); 
		bzero(mob_str[1], strlen(mob_str[1])); 
		bzero(mob_str[2], strlen(mob_str[2])); 
		bzero(mob_str[3], strlen(mob_str[3])); 
		sscanf(buf, "%s%s%s%s", mob_str[0], mob_str[1],mob_str[2], mob_str[3]);

		//登录处理
		if ( (strncmp(mob_str[1], SER_REQ_LOGIN_HEAD, strlen(mob_str[1]) )== 0) &&
			(strlen(mob_str[2]) > 0)){
			log_e("[%d]>收到手机端登录请求", __LINE__);
			log_e("mob_str[2]=%s", mob_str[2]);
			log_e("mob_str[3]=%s", mob_str[3]);

	#if 0
			//字符串截断比较+字符串长度比较  robin123
			if ((strncmp("robin", mob_str[2], strlen("robin")) == 0) &&
				(strncmp("123", mob_str[3], strlen("123")) == 0) ) {
				send(newfd, SER_ACK_YES, strlen(SER_ACK_YES), 0);
				
			}else {
				send(newfd, SER_ACK_NO, strlen(SER_ACK_NO), 0);
			}
	#else
			ret = do_login(mob_str[2], mob_str[3]);
			log_e("ret=%d", ret);
			if (ret == 9)
				send(newfd, SER_ACK_NO, strlen(SER_ACK_NO), 0);
			else if (ret == 1)
				send(newfd, SER_ACK_YES, strlen(SER_ACK_YES), 0);
			else 
				send(newfd, SER_ACK_NO, strlen(SER_ACK_NO), 0);

			
	#endif
		}
		if (ret == 0) {
			log_e("client fd=%d offline", newfd);
			break;
		}

	}
	return NULL;

}


void init_elog(void)
{
	
	/* 初始化 EasyLogger */
	elog_init(); //必须

	/* 设置全局日志过滤级别为 VERBOSE（最低级别） */
	elog_set_filter_lvl(ELOG_LVL_VERBOSE);
	elog_set_output_enabled(true);

	/*设置输出格式*/
	elog_set_fmt(ELOG_LVL_ASSERT, ELOG_FMT_ALL); //a 所有信息
	elog_set_fmt(ELOG_LVL_ERROR, ELOG_FMT_ALL&~ELOG_FMT_P_INFO&~ELOG_FMT_T_INFO);
	// 自定义日志格式：时间 | 级别 | 标签 | 内容 
	elog_set_fmt(ELOG_LVL_WARN, ELOG_FMT_ALL&~ELOG_FMT_P_INFO&~ELOG_FMT_T_INFO ); //无TAG PID
	elog_set_fmt(ELOG_LVL_INFO, ELOG_FMT_ALL&~ELOG_FMT_P_INFO&~ELOG_FMT_T_INFO ); //无PID TID
	elog_set_fmt(ELOG_LVL_DEBUG, ELOG_FMT_ALL&~ELOG_FMT_P_INFO&~ELOG_FMT_T_INFO ); //d 所有信息
	elog_set_fmt(ELOG_LVL_VERBOSE, ELOG_FMT_ALL&~ELOG_FMT_P_INFO&~ELOG_FMT_T_INFO ); //V 所有信息

}



//并发服务器的初始化
void start_tcp_server(void)
{
	int ret = -1;
	int newfd ;
	pthread_t tid;
	//1.买电话
	int fd = socket(AF_INET, SOCK_STREAM, 0);
	if (fd == -1) {
		log_e("socket %s", strerror(errno));
		
	}
	//重用端口
	int on = 1;
	setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
	
	//2.绑卡 ip+port
	struct sockaddr_in server; //设置服务端ip+port
	server.sin_family = AF_INET;
	server.sin_port = htons(12345);
	server.sin_addr.s_addr = inet_addr("192.168.105.10");
	ret = bind(fd, (struct sockaddr *)&server, sizeof(server));
	if (ret == -1) {
		log_e("bind %s", strerror(errno));
	}
	
	//3.监听
	
	listen(fd, 5);
	//4.接听
	struct sockaddr_in client; //接收客户端ip+port对象
	socklen_t len = sizeof(client);

	log_d("tcp server start... \n");
	system("netstat -na | grep 12345"); //查看tcp连接状态
	

	// 接收客户请求并建立和服务器端连接 并发服务器
	while (1) {
		newfd = accept(fd, (struct sockaddr *)&client, &len); //阻塞函数
		//没有客户端请求就让进程暂停,当有请求成功,建立连接返回
		if (newfd == -1) {
			perror("accept");
		}
		log_v("client ip=%s\n", inet_ntoa(client.sin_addr));
		log_v("client port=%d\n", ntohs(client.sin_port));
		log_v("客户端 fd=%d 上线!\n", newfd);
		

		//5.通信
		//创建和客户端通信的线程
		pthread_create(&tid, NULL, recv_mob_thread, &newfd);
	}
	//6.挂电话
	close(fd);
}


//项目入口函数
int main(void)
{

	init_elog();
	log_a("linux物联网中控程序");
	
	pthread_t tid_recv_coord_thread;
	//创建读串口数据的线程
	pthread_create(&tid_recv_coord_thread, NULL, recv_coord_thread, NULL);
	start_tcp_server(); //启动并发服务器

	return 0;
}
